home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
macros
/
latex209
/
contrib
/
slatex
/
preproc.ss
< prev
next >
Wrap
Text File
|
1993-11-07
|
3KB
|
87 lines
;preproc.ss
;Macro preprocessor for SLaTeX
;(c) Dorai Sitaram, Oct. 1992, Rice University
(define *macro-alist* '())
(define define-macro-transformer
(lambda (keyword transformer)
(let ((cell (assq keyword *macro-alist*)))
(if cell
(set-cdr! cell transformer)
(set! *macro-alist*
(cons (cons keyword transformer) *macro-alist*))))))
(define gensym
(let ((n -1))
(lambda ()
;generates an allegedly new symbol;
;this is a gross hack since there is no standardized way of
;getting uninterned symbols
(set! n (+ n 1))
(string->symbol (string-append "%:g" (number->string n) "%")))))
(define-macro-transformer 'fluid-let
(lambda (let-pairs . body)
(let ((x-s (map car let-pairs))
(i-s (map cadr let-pairs))
(old-x-s (map (lambda (p) (gensym)) let-pairs)))
`(let ,(map (lambda (old-x x) `(,old-x ,x)) old-x-s x-s)
,@(map (lambda (x i) `(set! ,x ,i)) x-s i-s)
(let ((%temp% (begin ,@body)))
,@(map (lambda (x old-x) `(set! ,x ,old-x)) x-s old-x-s)
%temp%)))))
(define-macro-transformer 'defenum
(lambda z
(let loop ((z z) (n 0) (r '()))
(if (null? z) `(begin ,@r)
(loop (cdr z) (+ n 1)
(cons `(define ,(car z) (integer->char ,n)) r))))))
(define-macro-transformer 'defrecord
(lambda (name . fields)
(let loop ((fields fields) (i 0) (r '()))
(if (null? fields)
`(begin (define ,name (lambda () (make-vector ,i)))
,@r)
(loop (cdr fields) (+ i 1)
(cons `(define ,(car fields) ,i) r))))))
(define-macro-transformer 'of
(lambda (r i . z)
(cond ((null? z) `(vector-ref ,r ,i))
((and (eq? i '/) (= (length z) 1))
`(string-ref ,r ,(car z)))
(else `(of (vector-ref ,r ,i) ,@z)))))
(define-macro-transformer 'setf
(lambda (l r)
(if (symbol? l) `(set! ,l ,r)
(let ((a (car l)))
`(,(cond ((eq? a 'list-ref) 'list-set!)
((eq? a 'string-ref) 'string-set!)
((eq? a 'vector-ref) 'vector-set!)
((eq? a 'of) 'the-setter-for-of)
(else (lerror 'setf)))
,@(cdr l) ,r)))))
(define-macro-transformer 'the-setter-for-of
(lambda (r i j . z)
(cond ((null? z) `(vector-set! ,r ,i ,j))
((and (eq? i '/) (= (length z) 1))
`(string-set! ,r ,j ,(car z)))
(else `(the-setter-for-of (vector-ref ,r ,i) ,j ,@z)))))
(define preprocess-macros
(lambda (e)
(if (not (pair? e)) e
(let* ((a (car e))
(c (assq a *macro-alist*)))
(cond (c (preprocess-macros (apply (cdr c) (cdr e))))
((eq? a 'quote) e)
((eq? a 'lambda)
(cons a (cons (cadr e)
(map preprocess-macros (cddr e)))))
(else (map preprocess-macros e)))))))